package org.example.dbcompare.model;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 列信息模型
 * @author wuyong
 * @date 2025/10/22
 */
@Data
public class ColumnInfo {
    /**
     * 表名
     */
    private String tableName;
    
    /**
     * 列名
     */
    private String columnName;
    
    /**
     * 数据类型
     */
    private String dataType;
    
    /**
     * 列大小
     */
    private Integer columnSize;
    
    /**
     * 小数位数
     */
    private Integer decimalDigits;
    
    /**
     * 精度
     */
    private Integer numPrecRadix;
    
    /**
     * 是否允许NULL
     */
    private Boolean nullable;
    
    /**
     * 默认值
     */
    private String columnDef;
    
    /**
     * 字符最大长度
     */
    private Integer charOctetLength;
    private String columnDefault;
    
    /**
     * 列在表中的位置
     */
    private Integer ordinalPosition;
    
    /**
     * 是否为空字符串
     */
    private String isNullable;
    
    /**
     * 列的作用域
     */
    private String scopeCatalog;
    
    /**
     * 列的作用域模式
     */
    private String scopeSchema;
    
    /**
     * 列的作用域表名
     */
    private String scopeTable;
    
    /**
     * 源数据类型
     */
    private Short sourceDataType;
    
    /**
     * 是否自动递增
     */
    private String isAutoincrement;
    
    /**
     * 是否生成列
     */
    private String isGeneratedcolumn;
    
    /**
     * 列注释
     */
    private String remarks;
    
    /**
     * 构造函数
     */
    public ColumnInfo() {}
    
    /**
     * 从ResultSet构造ColumnInfo
     * @param tableName 表名
     * @param rs ResultSet
     * @throws SQLException SQL异常
     */
    public ColumnInfo(String tableName, ResultSet rs) throws SQLException {
        this.tableName = tableName;
        if(rs.next()) {
            this.columnName = rs.getString("COLUMN_NAME");
            this.dataType = rs.getString("TYPE_NAME");
            this.columnSize = rs.getInt("COLUMN_SIZE");
            this.decimalDigits = rs.getInt("DECIMAL_DIGITS");
            this.numPrecRadix = rs.getInt("NUM_PREC_RADIX");
            this.nullable = rs.getBoolean("NULLABLE");
            this.columnDef = rs.getString("COLUMN_DEF");   //默认值
            this.charOctetLength = rs.getInt("CHAR_OCTET_LENGTH");
            this.ordinalPosition = rs.getInt("ORDINAL_POSITION");
            this.isNullable = rs.getString("IS_NULLABLE");
            this.scopeCatalog = rs.getString("SCOPE_CATALOG");
            this.scopeSchema = rs.getString("SCOPE_SCHEMA");
            this.scopeTable = rs.getString("SCOPE_TABLE");
            this.sourceDataType = rs.getShort("SOURCE_DATA_TYPE");
            this.isAutoincrement = rs.getString("IS_AUTOINCREMENT");
            this.isGeneratedcolumn = rs.getString("IS_GENERATEDCOLUMN");
            this.remarks = rs.getString("REMARKS");
        }
    }
    
    /**
     * 获取完整的列定义
     * @return 列定义字符串
     */
    public String buildColumnDefinition() {
        StringBuilder sb = new StringBuilder();
        sb.append("`").append(columnName).append("` ");
        
        // 数据类型
        sb.append(dataType);
        
        // 长度和精度
        if (columnSize != null && columnSize > 0&& (!StringUtils.equals("DATETIME",dataType))) {
            sb.append("(").append(columnSize);
            if (decimalDigits != null && decimalDigits > 0) {
                sb.append(",").append(decimalDigits);
            }
            sb.append(")");
        }
        
        // 是否允许NULL
        if ("NO".equals(isNullable)) {
            sb.append(" NOT NULL");
        }
        
        // 默认值
        if (columnDef != null && !columnDef.isEmpty()) {
            sb.append(" DEFAULT ").append(columnDef);
        }
        
        // 自动递增
        if ("YES".equals(isAutoincrement)) {
            sb.append(" AUTO_INCREMENT");
        }
        
        // 注释
        if (remarks != null && !remarks.isEmpty()) {
            sb.append(" COMMENT '").append(remarks).append("'");
        }
        
        return sb.toString();
    }
}